import zipfile

def data_load(range, file_path):
    """
    加载并处理文本数据。

    :param range: 要加载的文本长度
    :param file_path: 压缩文件路径
    :return: 处理后的文本、字符到索引的映射、索引到字符的映射、词汇表大小
    """
    # 尝试打开zip文件来读取文本数据
    try:
        with zipfile.ZipFile(file_path) as zin:
            with zin.open("jaychou_lyrics.txt") as f:
                texts = f.read().decode('utf-8')
    except (zipfile.BadZipFile, FileNotFoundError) as e:
        # 如果文件不是zip文件或找不到文件，则打印错误并返回None值
        print(f"Error reading file: {e}")
        return None, None, None, None

    # 如果指定的文本长度超过实际文本长度，则调整为实际文本长度
    if range > len(texts):
        range = len(texts)

    # 将文本中的换行符替换为空格，并截取前range个字符
    texts = texts.replace('\n', ' ')
    texts = texts[:range]

    # 创建字符到索引的映射和索引到字符的映射
    idx_to_char = list(set(texts))
    char_to_idx = {c: i for i, c in enumerate(idx_to_char)}

    # 计算词汇表大小
    vocab_size = len(idx_to_char)

    # 返回处理后的文本、字符到索引的映射、索引到字符的映射和词汇表大小
    return texts, idx_to_char, char_to_idx, vocab_size
